#include <string>
#include <algorithm>
#include <vector>
#include <stdexcept>
#include <iostream>
#include <cctype>
#include <cmath>
#include <utility>

using namespace std;
using size_type = std::string::size_type; // 添加类型别名

#ifndef LARGENUMCALCIMPL_H
#define LARGENUMCALCIMPL_H

class LargeNumCalcImpl {
    public:
        static string add(const string& num1, const string& num2);
        static string subtract(const string& num1, const string& num2);
        static string multiply(const string& num1, const string& num2);
        static string divide(const string& num1, const string& num2);
        static string power(const string& base, const string& exponent);
        static string factorial(const string& num);

    private:
        static string subtractStrings(const string& a, const string& b, int borrow);
        static int compareNumbers(const string& a, const string& b);
        static pair<string, string> splitNumber(const string& num);   // 将数字拆分成整数部分和小数部分
        static string addStrings(const string& num1, const string& num2);
        // 预处理结果结构体
        struct PreProcessResult {
            string sign;
            string x;
            string y;
            int decimalPlaces;
        };
        // 辅助函数声明
        static PreProcessResult preProcess(const string& a, const string& b);
        static string postProcess(const string& result, const string& sign, int decimalPlaces);
        static string karatsubaMultiply(const string& x, const string& y);
        static string multiplyStrings(const string& num1, const string& num2);
        static pair<string, string> splitNumber(const string& num, int position);   // 拆分数字
        static string longDivision(const string& dividend, const string& divisor);
        static string divideByTwo(const string& numStr);

};

#endif // LARGENUMCALCIMPL_H